package org.adoxx.bpmn; import java.util.Date; import java.util.Locale; import java.util.Map.Entry; import org.adoxx.pn.PetriNet; import org.adoxx.pn.PetriNet.PL; import org.adoxx.pn.PetriNet.TR; import org.adoxx.pn.input.ImporterManager; import org.adoxx.pn.simulation.PathCollector; import org.adoxx.pn.simulation.Simulation; import org.adoxx.pn.simulation.TraceCollector; import org.adoxx.pn.simulation.TransitionSelectorAdoxx; import org.adoxx.pn.simulation.data.Path; import org.adoxx.pn.simulation.data.Trace; import org.adoxx.pn.simulation.data.measures.Measures; import org.adoxx.pn.simulation.handlers.impl.CostCalculator; import org.adoxx.pn.simulation.handlers.impl.ExecutionTimeCalculator; import org.adoxx.pn.simulation.handlers.impl.PathGeneration; import org.adoxx.pn.simulation.handlers.impl.TraceGeneration; import org.adoxx.pn.simulation.handlers.impl.WaitingTimeCalculator; import org.adoxx.utils.Utils; public class SimulationEngine { private boolean fullResults = false; private ImporterManager importManager = new ImporterManager(); public void returnFullResults(boolean fullResults){ this.fullResults = fullResults; } public String executePathAnalysis(String model, int numExecutions) throws Exception{ String ret = ""; PetriNet[] pnList = importManager.generateFromModel(model); for(PetriNet pn:pnList){ long startingSimulationTime = new Date().getTime(); Simulation simulation = new Simulation(pn); simulation.setTransitionSelector(new TransitionSelectorAdoxx(pn)); TraceGeneration traceGeneration = new TraceGeneration(); PathGeneration pathGeneration = new PathGeneration(); ExecutionTimeCalculator executionTimeCalculator = new ExecutionTimeCalculator(); CostCalculator costCalculator = new CostCalculator(); WaitingTimeCalculator waitingTimeCalculator = new WaitingTimeCalculator(executionTimeCalculator); //WaitingTimeCalculator require ExecutionTimeCalculator so also in the listener the ExecutionTimeCalculator have to be specified before simulation.addSimulationListener(traceGeneration); simulation.addSimulationListener(pathGeneration); simulation.addSimulationListener(executionTimeCalculator); simulation.addSimulationListener(costCalculator); simulation.addSimulationListener(waitingTimeCalculator); //have to be defined AFTER the executionTimeCalculator listener TraceCollector traceCollector = new TraceCollector(); PathCollector pathCollector = new PathCollector(); for(int executionCounter=0;executionCounter"; ret += ""; ret += ""+Utils.convertoMillisecondsToStringDateTime(enlapsedSimulationTime)+""; ret += ""+String.format(Locale.ENGLISH, "%.2f", traceCollector.totalMeasures.averageCosts)+""; ret += ""+traceCollector.totalMeasures.maxCosts+""; ret += ""+Utils.convertoMillisecondsToStringDateTime((int)traceCollector.totalMeasures.averageExecutionTime)+""; ret += ""+traceCollector.totalMeasures.getNumberOfExecutionIn(oneDay)+""; ret += ""+Utils.convertoMillisecondsToStringDateTime(traceCollector.totalMeasures.maxExecutionTime)+""; ret += ""+String.format(Locale.ENGLISH, "%.2f", pathCollector.totalMeasures.bestProbability)+""; ret += ""+traceCollector.totalMeasures.totalTraces+""; ret += ""+traceCollector.traceMeasurementsMap.size()+""; ret += ""+pathCollector.pathMeasurementsMap.size()+""; ret += ""; ret += ""; for(Entry entryPathMeasures:pathCollector.pathMeasurementsMap.entrySet()){ ret += ""; ret += ""; for(Entry entry:entryPathMeasures.getKey().transitionMap.entrySet()){ //ret += ""+entry.getKey().description+""; ret += ""+entry.getKey().description+""; } ret += ""; ret += ""; } ret += ""; ret += ""; for(Entry entryTraceMeasures:traceCollector.traceMeasurementsMap.entrySet()){ ret += ""; ret += ""; org.adoxx.pn.simulation.data.Trace.TraceNode currentTraceNode = entryTraceMeasures.getKey().startingNode; while(currentTraceNode!=null){ String objId = currentTraceNode.executedTransition.description; ret += ""+objId+""; currentTraceNode = currentTraceNode.nextNode; } ret += ""; ret += ""; for(Entry entrySet:entryTraceMeasures.getValue().waitingTimeMap.entrySet()) if(entrySet.getValue().getWaitingTime()>0) ret += ""+Utils.convertoMillisecondsToStringDateTime(entrySet.getValue().getWaitingTime())+""; ret += ""; ret += ""; } ret += ""; ret += ""; return ret; } private String formatResultsLight(TraceCollector traceCollector, PathCollector pathCollector, PetriNet pn, long enlapsedSimulationTime) throws Exception{ long oneDay = Utils.convertAdoxxDateTimeToMilliseconds("00:000:08:00:00"); String ret = ""; ret += ""; ret += ""+Utils.convertoMillisecondsToStringDateTime(enlapsedSimulationTime)+""; ret += ""+String.format(Locale.ENGLISH, "%.2f", traceCollector.totalMeasures.averageCosts)+""; ret += ""+traceCollector.totalMeasures.maxCosts+""; ret += ""+Utils.convertoMillisecondsToStringDateTime((int)traceCollector.totalMeasures.averageExecutionTime)+""; ret += ""+traceCollector.totalMeasures.getNumberOfExecutionIn(oneDay)+""; ret += ""+Utils.convertoMillisecondsToStringDateTime(traceCollector.totalMeasures.maxExecutionTime)+""; ret += ""+String.format(Locale.ENGLISH, "%.2f", pathCollector.totalMeasures.bestProbability)+""; ret += ""+traceCollector.totalMeasures.totalTraces+""; ret += ""+traceCollector.traceMeasurementsMap.size()+""; ret += ""+pathCollector.pathMeasurementsMap.size()+""; ret += ""; ret += ""; for(Entry entryPathMeasures:pathCollector.pathMeasurementsMap.entrySet()){ ret += ""; ret += ""; for(Entry entry:entryPathMeasures.getKey().transitionMap.entrySet()){ //ret += ""+entry.getKey().description+""; ret += ""+entry.getKey().description+""; } ret += ""; ret += ""; } ret += ""; ret += ""; return ret; } /* public static void main(String[] args) { try { String bpmnUrl = "D:\\TOOLS\\eclipse\\workspace\\test\\BP2.xml"; String bpmnModel = new String(org.adoxx.utils.IOUtils.readFile(bpmnUrl)); SimulationEngine sm = new SimulationEngine(); String res = sm.executePathAnalysis(bpmnModel, 1000); //100000 System.out.println(res); }catch(Exception ex){ex.printStackTrace();} } */ }